/**
 * API 请求工具
 * 自动添加 token 和错误处理
 */

import authManager from './auth.js'

// 基础配置
const BASE_URL = 'http://localhost:8080/ruoyi-user'
const TIMEOUT = 30000 // 增加到30秒

/**
 * 发送请求
 * @param {Object} options 请求配置
 */
const request = (options) => {
  return new Promise((resolve, reject) => {
    // 构建完整URL
    const url = options.url.startsWith('http') ? options.url : `${BASE_URL}${options.url}`
    
    // 获取认证头
    const authHeaders = authManager.getAuthHeaders()
    
    // 请求配置
    const config = {
      url,
      method: options.method || 'GET',
      data: options.data || {},
      header: {
        ...authHeaders,
        ...options.header
      },
      timeout: options.timeout || TIMEOUT
    }
    
    console.log('发送请求:', {
      url: config.url,
      method: config.method,
      headers: config.header,
      data: config.data,
      timeout: config.timeout
    })
    
    // 调试：检查token状态
    console.log('Token状态:', {
      isLogin: authManager.checkLogin(),
      token: authManager.getToken(),
      userInfo: authManager.getUserInfo()
    })
    
    uni.request({
      ...config,
      success: (response) => {
        console.log('请求响应:', response)
        
        // 检查HTTP状态码
        if (response.statusCode === 200) {
          // 检查业务状态码
          if (response.data && response.data.code === 200) {
            resolve(response.data)
          } else {
            // 对于身份认证相关接口，即使业务状态码不是200也直接返回数据
            // 因为后端可能返回不同的状态码但数据是有效的
            if (config.url.includes('/user/identity/') || config.url.includes('/user/profile/')) {
              console.log('身份认证接口返回非200状态码，但继续处理数据:', response.data)
              resolve(response.data)
            } else {
              const error = new Error(response.data?.msg || '请求失败')
              error.code = response.data?.code
              reject(error)
            }
          }
        } else if (response.statusCode === 401) {
          // 对于身份认证相关接口，不自动登出
          if (config.url.includes('/user/identity/') || config.url.includes('/user/profile/')) {
            console.log('身份认证接口返回401，但不自动登出')
            reject(new Error('身份认证接口访问失败'))
          } else {
            // token过期，清除用户信息
            authManager.logout()
            uni.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none'
            })
            setTimeout(() => {
              uni.reLaunch({
                url: '/pages/login/login'
              })
            }, 1500)
            reject(new Error('登录已过期'))
          }
        } else {
          reject(new Error(`HTTP错误: ${response.statusCode}`))
        }
      },
      fail: (error) => {
        console.error('请求失败:', error)
        let message = '网络请求失败'
        
        if (error.errMsg) {
          if (error.errMsg.includes('timeout')) {
            message = '请求超时，请检查网络连接或稍后重试'
            console.log('请求超时详情:', {
              url: config.url,
              timeout: config.timeout,
              error: error.errMsg
            })
          } else if (error.errMsg.includes('fail')) {
            message = '网络连接失败，请检查网络设置'
          } else {
            message = error.errMsg
          }
        }
        
        // 不在这里显示 toast，让调用方处理
        console.error('API请求失败:', {
          url: config.url,
          method: config.method,
          error: error,
          message: message
        })
        
        reject(new Error(message))
      }
    })
  })
}

/**
 * GET 请求
 */
export const get = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'GET',
    data,
    ...options
  })
}

/**
 * POST 请求
 */
export const post = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  })
}

/**
 * PUT 请求
 */
export const put = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  })
}

/**
 * DELETE 请求
 */
export const del = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  })
}

export default request
